import { Fragment } from '@/components/Fragment';
import {
Tabs,
TabItem,
Flex,
Text,
IconEmail,
Badge,
} from '@aws-amplify/ui-react';
import { TabsDemo } from './demo';
import { Example, ExampleCode } from '@/components/Example';
import {
AriaLabel,
BadgeIcons,
BasicTabs,
ControlledTabExample,
DataAttributeStyles,
DefaultTabUncontrolled,
DisabledTabs,
IndicatorPosition,
JustifyContent,
OverrideStyleClasses,
PseudoStyles,
Spacing,
StyleProps,
TabsThemeExample,
Title,
} from './examples';
import { ComponentStyleDisplay } from '@/components/ComponentStyleDisplay';
import ThemeExample from '@/components/ThemeExample.mdx';
## Demo
## Usage
Import the `Tabs` and `TabItem` components.
```jsx file=./examples/BasicTabs.tsx
```
The `Tabs` component accepts `TabItems` as children. Each `TabItem` contains both the Tab's `title` and its corresponding content panel (children). Children passed to `TabItem` are responsible for their own styling.
### Default Tab (uncontrolled)
In the `Tabs` component, use the `defaultIndex` prop to change which Tab content is initially displayed. Pass in the index of the Tab you wish to show. The default is index 0 (the first tab).
```jsx file=./examples/DefaultTabUncontrolled.tsx
```
### Current Index and onChange (controlled)
The tabs component also works as a controlled component. This allows you to programmatically set the current tab
```jsx file=./examples/ControlledTabExample.tsx
```
### Grow
In the `Tabs` component, use the `spacing` prop to control how Tabs take up the remaining space. Pass `equal` to make each tab take up the same amount of space, and `relative` to make each tab take up space relative to the size of its title.
```jsx file=./examples/Spacing.tsx
```
### Justify Content
In the `Tabs` component, use the `justifyContent` prop to control how space is distributed between and around the Tabs. Available options include `flex-start` (default), `flex-end`, `center`, `space-between`, `space-around`, and `space-evenly`.
Note: this prop only has an effect if the `spacing` prop is not set, otherwise the `spacing` prop will take precedence.
```jsx file=./examples/JustifyContent.tsx
```
### Title
In the `TabItem` component, use the **required** `title` prop to change the title corresponding with each Tab's content panel. For styling purposes, you may pass your own custom component if you wish.
```jsx file=./examples/Title.tsx
```
You can also add badges and icons in the `TabItem` by passing custom components to the `title` prop.
```jsx file=./examples/BadgeIcons.tsx
```
### Indicator Position
You can change the position of the tab border and current tab indicator with the `indicatorPosition` prop. The only values are `top` or `bottom` (default).
```jsx file=./examples/IndicatorPosition.tsx
```
### Disabled Tabs
In the `TabItem` component, use the `isDisabled` prop to make a Tab not clickable and its content not visible to the user.
```jsx file=./examples/DisabledTabs.tsx
```
## CSS Styling
```tsx file=./examples/TabsThemeExample.tsx
```
### Target classes
### Global styling
To override styling on all `Tabs` or `TabItems`, you can set the Amplify CSS variables, use the built-in `.amplify-tabs` or `.amplify-tabs-items`classes, or use pseudo-classes.
Note that children of `TabItem` must be responsible for their own styling.
```css
/* styles.css */
[data-amplify-theme] {
/* background for the whole tab bar */
--amplify-components-tabs-background-color: var(
--amplify-colors-background-secondary
);
/* background for each tab */
--amplify-components-tabs-item-background-color: var(
--amplify-colors-background-primary
);
}
/* OR */
.amplify-tabs {
background-color: var(--amplify-colors-background-secondary);
}
.amplify-tabs-item {
background-color: var(--amplify-colors-background-primary);
}
```
#### Using pseudo-classes
```css
/* styles.css */
.amplify-tabs-item:hover {
background-color: var(--amplify-colors-background-primary);
border-color: var(--amplify-colors-purple-60);
}
.amplify-tabs-item[data-state='active'] {
background-color: var(--amplify-colors-background-primary);
border-color: var(--amplify-colors-pink-60);
}
.amplify-tabs-item:focus {
background-color: var(--amplify-colors-pink-10);
}
````
To replace the Tabs styling, unset it:
```css
.amplify-tabs {
all: unset;
/* Add your styling here*/
}
.amplify-tabs-items {
all: unset;
/* Add your styling here*/
}
```
### Local styling
To override styling on a specific `Tabs` or `TabItem` component, you can use (in order of increasing specificity): a class selector, data attributes, or style props.
#### Using a class selector
```css
/* styles.css */
.custom-tabs {
background-color: var(--amplify-colors-brand-primary-60);
justify-content: center;
border-color: transparent;
}
.custom-tab-item {
background-color: var(--amplify-colors-brand-primary-80);
color: var(--amplify-colors-font-inverse);
border-color: transparent;
}
.custom-tab-item:hover {
color: var(--amplify-colors-font-inverse);
background-color: var(--amplify-colors-brand-primary-90);
}
.custom-tab-item[data-state='active'] {
color: var(--amplify-colors-font-inverse);
border-color: transparent;
background-color: var(--amplify-colors-brand-primary-100);
}
````
#### Using data attributes
```css
/* styles.css */
/* When a Tab is selected and displaying its corresponding content panel */
.amplify-tabs-item[data-state='active'] {
background-color: var(--amplify-colors-brand-primary-20);
}
/* When a Tab is disabled */
.amplify-tabs-item[data-disabled] {
background-color: var(--amplify-colors-background-tertiary);
}
```
#### Using style props
```jsx file=./examples/StyleProps.tsx
```
Note: there is currently no way to style different states like hover using only style props. However Amplify UI works well with CSS in JS frameworks for this usecase. Take a look at the [alternative styling docs](/guides/css-in-js) for information how to use CSS in JS with Amplify UI.
## Accessibility
Adheres to the [Tabs WAI-ARIA design pattern](https://www.w3.org/WAI/ARIA/apg/patterns/tabs/).
We recommend passing an `ariaLabel` prop to help enable assistive technology.
```jsx file=./examples/AriaLabel.tsx
```